package business.database.sqliteMaescorp

import domain.Center
import groovy.sql.Sql
import java.util.HashMap;
import java.util.List;

/**
 * DAO para la tabla Corp
 * @author Administrador
 *
 */
public class CenterDAO {
	
	private def Sql sqlite;
	
	/**
	 * Inicializamos la clase con la instance de SQL
	 * @param sql
	 */
	public CenterDAO(Sql sql) {
		sqlite = sql;
	}
	
/**
 * Crea la tabla
 */
	public void create() {
		sqlite.execute "CREATE TABLE  IF NOT EXISTS Center (idCe integer primary key, ISO varchar(5), PROVINCIA varchar(2), INSTIT varchar(4), ORGANISMO varchar(6), DPTO varchar(8), SECTOR varchar(5), UNIQUE (ISO, PROVINCIA, INSTIT, ORGANISMO, DPTO));"
		sqlite.execute "create index IF NOT EXISTS idx_PIO on center(iso, provincia, instit, organismo);"
		sqlite.execute "create index IF NOT EXISTS idx_Instit on center(iso, instit);"
		sqlite.execute "create index IF NOT EXISTS idx_Org on center(iso, organismo);"
		sqlite.execute "create index IF NOT EXISTS idx_PI on center(iso, provincia, instit);"
		sqlite.execute "create index IF NOT EXISTS idx_PIOD on center(iso, provincia, instit, organismo,dpto);"
		sqlite.execute "create index IF NOT EXISTS idx_PO on center(iso, provincia, organismo);"
		sqlite.execute "create index IF NOT EXISTS idx_Prov on center(iso, provincia);"
		sqlite.execute "create index IF NOT EXISTS idx_Sector on center(iso, sector);"
		sqlite.execute "create index IF NOT EXISTS idx_idCen on center(idCe);"
	}
	
	/**
	 * Obtiene el maximo idcorp de la tabla
	 * @return
	 */
	public int maxidCe() {
		String sqlQuery = "Select max(idce) as MAXID from Center"
		def max = sqlite.firstRow(sqlQuery)
					
		int id
		if ((max != null) && (max[0] != null))
			id = max[0] + 1
		else id = 1
	}
	
	/**
	 * Inserta un corp
	 * @param idcorp
	 * @param corp
	 */
	public void insert(int idce, String iso, String prov, String instit, String org, String dpto, String sector) {
		sqlite.execute("insert into Center values (${idce},?,?,?,?,?,?)",[iso,prov,instit,org, dpto,sector]);
	}
	
	/**
	 * Obtiene el idce para el ISO PIOD sector
	 * 
	 * @return id center
	 */
	public Integer selectIdCe(String iso, String prov, String instit, String org, String dpto) {
		
		def cen = sqlite.firstRow("Select idCe from Center WHERE ISO = ? AND PROVINCIA = ? AND INSTIT = ? AND ORGANISMO = ? AND DPTO = ?",[iso,prov,instit,org, dpto])
		if ((cen != null)&&(cen[0] != null))
			return cen[0]
		else return null;
					
	}
	
	/**
	 * 
	 * @return listado con todas las provincias
	 */
	public List<String> selectAllProvincias() {
		List<String> provs = new ArrayList<String>();
		
		sqlite.eachRow("select distinct provincia from center", {
			provs.add(it[0]);
					
		})
		
		return provs;
	}
	/**
	* Borra el corp
	* @param idcorp
	*/
   public void delete(int idce) {
	   sqlite.execute("delete from center where idce = ${idce}");
   }
   
   
	/**
	 * Obtiene el centro indicado
	 * @param idce identificador del centro
	 * @return centro
	 */
	public Center select(int idce) {
		
		Center cen = null;
		sqlite.eachRow("select iso,provincia,instit,organismo,dpto,sector from center where idce = ${idce}", {
			
			cen = new Center(it[0],it[1],it[2],it[3],it[4],it[5]);
			
		})
		
		return cen;
		
	}
	
	/**
	* Obtiene un listado de centros para un corp
	* @param idcorp
	* @return
	*/
   public List<Center> selectCenter(int idcorp) {
	   List<Center> cens = new ArrayList<Center>();
	   sqlite.eachRow("select iso,provincia,instit,organismo,dpto,sector from center ce inner join centers_corps cc on cc.idce = ce.idce where cc.idcorp = ${idcorp}", {
		   
		   cens.add(new Center(it[0],it[1],it[2],it[3],it[4],it[5]));
		   
	   })
	   
	   return cens;
   }
   
   /**
    * 
    * @param idcorp
    * @param prov
    * @return listado de centros de la provincia indicada
    */
   public List<Center> selectCenterByProv(int idcorp, String prov) {
	   List<Center> cens = new ArrayList<Center>();
	   sqlite.eachRow("select iso,provincia,instit,organismo,dpto,sector from center ce inner join centers_corps cc on cc.idce = ce.idce where cc.idcorp = ${idcorp} and ce.provincia = ?",[prov], {
		   
		   cens.add(new Center(it[0],it[1],it[2],it[3],it[4],it[5]));
		   
	   })
	   
	   return cens;
   }
	
	
}
